package com.proxy.server.backend.nio;


import com.proxy.common.pool.PoolObject;
import com.proxy.common.pool.PooledObjectFactory;
import com.proxy.common.pool.impl.BasePoolObject;

/**
 * Created by fish on 2016/6/9.
 */
public class NioBackendConnectionFactory implements PooledObjectFactory<NioBackendConnection> {

    private  NioBackendClient client;


    public NioBackendConnectionFactory(NioBackendClient client) {
        this.client = client;
    }


    @Override
    public NioBackendConnection createObject(){
        NioBackendConnection  connection =  new NioBackendConnection(client);
        if(connection.register()){
            return connection;
        }
        return null;
    }

    /**
     * 销毁对象,如果对象池中检测到某个"对象"idle的时间超时,或者操作者向对象池"归还对象"时检测到"对象"已经无效,那么此时将会导致"对象销毁";
     * "销毁对象"的操作设计相差甚远,但是必须明确:当调用此方法时,"对象"的生命周期必须结束.如果object是线程,那么此时线程必须退出;
     * 如果object是socket操作,那么此时socket必须关闭;如果object是文件流操作,那么此时"数据flush"且正常关闭.
     */
    @Override
    public void destroyObject(NioBackendConnection connection){
        connection.close();
    }

    /**
     * 检测对象是否"有效";Pool中不能保存无效的"对象",因此"后台检测线程"会周期性的检测Pool中"对象"的有效性,
     * 如果对象无效则会导致此对象从Pool中移除,并destroy;此外在调用者从Pool获取一个"对象"时,也会检测"对象"的有效性,确保不能讲"无效"的对象输出给调用者;
     * 当调用者使用完毕将"对象归还"到Pool时,仍然会检测对象的有效性.所谓有效性,就是此"对象"的状态是否符合预期,是否可以对调用者直接使用;
     * 如果对象是Socket,那么它的有效性就是socket的通道是否畅通/阻塞是否超时等.
     */
    @Override
    public boolean validateObject(NioBackendConnection connection) {
        //设置心跳
        return connection.isActive();

    }

}

